#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (!newNode) {
        printf("内存分配失败\n");
        exit(1);
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 有序插入链表
void sortedInsert(Node** head, int data) {
    Node* newNode = createNode(data);
    
    // 链表为空或新节点值小于头节点
    if (*head == NULL || (*head)->data >= data) {
        newNode->next = *head;
        *head = newNode;
    } else {
        Node* current = *head;
        // 找到合适的插入位置
        while (current->next != NULL && current->next->data < data) {
            current = current->next;
        }
        newNode->next = current->next;
        current->next = newNode;
    }
}

// 合并两个有序链表
Node* mergeSortedLists(Node* LA, Node* LB) {
    Node dummy; // 哑节点简化操作
    Node* tail = &dummy;
    dummy.next = NULL;
    
    while (1) {
        if (LA == NULL) {
            tail->next = LB;
            break;
        }
        if (LB == NULL) {
            tail->next = LA;
            break;
        }
        
        if (LA->data <= LB->data) {
            tail->next = LA;
            LA = LA->next;
        } else {
            tail->next = LB;
            LB = LB->next;
        }
        tail = tail->next;
    }
    
    return dummy.next;
}

// 打印链表
void printList(Node* node) {
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
    printf("\n");
}

// 释放链表内存
void freeList(Node* head) {
    Node* tmp;
    while (head != NULL) {
        tmp = head;
        head = head->next;
        free(tmp);
    }
}

int main() {
    Node* LA = NULL;
    Node* LB = NULL;
    Node* LC = NULL;
    
    // 用户输入第一个有序链表
    printf("输入第一个有序链表的元素个数: ");
    int n, data;
    scanf("%d", &n);
    printf("输入%d个有序整数: ", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &data);
        sortedInsert(&LA, data);
    }
    
    // 用户输入第二个有序链表
    printf("输入第二个有序链表的元素个数: ");
    scanf("%d", &n);
    printf("输入%d个有序整数: ", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &data);
        sortedInsert(&LB, data);
    }
    
    // 合并链表
    LC = mergeSortedLists(LA, LB);
    
    // 输出结果
    printf("合并后的有序链表: ");
    printList(LC);
    
    // 释放内存
    freeList(LA);
    freeList(LB);
    freeList(LC);
    
    return 0;
}